package com.example.init;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

/**
 * 队列初始化程序，负责启动项目的时候，检查队列是否存在，不存在则创建队列
 * 使用注解@Component会在项目启动的时候，自动加载到内存中
 */
@Component
class QueueInitializer {

    @Autowired
    private RabbitAdmin rabbitAdmin;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /** 使用注解@PostConstruct ，在项目启动的时候会被自动调用，而如果使用了注解@PreDestroy则会在容器 关闭的时候调用这个方法 */
    @PostConstruct
    public void init() {
        // 声明队列 语法：名称，是否持久化，是否独占队列（独占则只有单个消费者，当消费者关闭则队列是删除，反之被多个消费者连接共享消息），是否自动删除消息
        Queue queue = new Queue("test", true, false, false);
        // 创建队列
        rabbitAdmin.declareQueue(queue);
        System.out.println("Queue 'test' declared!");

        // 检查队列是否存在
        if (rabbitAdmin.getQueueProperties("test") != null) {
            System.out.println("Queue 'test' exists!");

            // 投递初始消息
            rabbitTemplate.convertAndSend("testExchange", "testRoutingKey", "Initial message");
            System.out.println("Initial message sent to queue 'test'!");
        } else {
            System.err.println("Failed to create queue 'test'!");
        }
    }
}